package com.fanrenqiji.modules.business.utils;


import com.fanrenqiji.common.utils.SpringContextHolder;
import com.fanrenqiji.modules.business.dict.entity.BusDict;
import com.fanrenqiji.modules.business.dict.service.BusDictService;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;


/**
 * W
 *
 * @author weihaitao E-mail:wwwqqlyw@163.com
 * @version 创建时间：2015年2月2日 下午5:32:18
 * @description 获取字典标签工具类
 */
public class BusDictUtils {

    private static BusDictService busDictService = SpringContextHolder.getBean(BusDictService.class);

    public static final String CACHE_BUS_DICT_MAP = "busDictMap";

    /**
     * 获得业务字典便签
     *
     * @param id 字典的唯一标签码，业务字典主键
     * @return label 业务字典标签
     */
    public static String getBusDictLabel(Long id) {
        String label = "";
        if ((id != null)) {
            BusDict busDict = busDictService.findOne(id);
            label = busDict.getLabel();
        }
        return label;
    }


    /**
     * 获取字典值
     *
     * @param label        标签名
     * @param type         词典的类型
     * @param defaultLabel 默认标签名
     * @return
     */
    public static String getBusDictValue(String label, String type,
                                         String defaultLabel) {
        if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(label)) {
            for (BusDict dict : getBusDictList(type)) {
                if (type.equals(dict.getType())
                        && label.equals(dict.getLabel())) {
                    return dict.getValue();
                }
            }
        }
        return defaultLabel;
    }

    /**
     * 获取字典label,从缓存中加载
     *
     * @param key  字典的键值
     * @param type 词典的类型
     * @return 字段的中文名
     */
    public static String getLabelByValue(String key, String type) {
        String label = "";
        if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(key)) {
            for (BusDict dict : getBusDictList(type)) {
                if (type.equals(dict.getType()) && key.equals(dict.getValue())) {
                    return dict.getLabel();
                }
            }
        }
        return label;
    }

    /**
     * 获取字典对象列表
     *
     * @param type 词典的类型
     * @return
     */
    public static List<BusDict> getBusDictList(String type) {
        @SuppressWarnings("unchecked")
        Map<String, List<BusDict>> dictMap = Maps.newHashMap();
        for (BusDict dict : busDictService.findAllList()) {
            List<BusDict> dictList = dictMap.get(dict.getType());
            if (dictList != null) {
                dictList.add(dict);
            } else {
                dictMap.put(dict.getType(), Lists.newArrayList(dict));
            }
        }

        //Bug 当dictMap不为NULL的时候,新加入数据库的type是无法获取到的解决：
        //1、如果查不到的情况下从新查下数据库；2、在增加的地方加入到缓存中。
        List<BusDict> dictList = dictMap.get(type);
        if (dictList == null) {
            dictList = Lists.newArrayList();
        }
        return dictList;
    }


}
